13. K8S之Secret
1. 概述
Secret
对象类型用来保存敏感信息,例如密码、OAuth 令牌和 SSH 密钥。 将这些信息放在 secret
中比放在 Pod 的定义或者 容器镜像 中来说更加安全和灵活。 参阅 Secret 设计文档 获取更多详细信息。
Secret 是一种包含少量敏感信息例如密码、令牌或密钥的对象。 这样的信息可能会被放在 Pod 规约中或者镜像中。 用户可以创建 Secret,同时系统也创建了一些 Secret。
要使用 Secret,Pod 需要引用 Secret。 Pod 可以用三种方式之一来使用 Secret:
2. 类型
内置类型 | 用法 |
---|---|
Opaque |
用户定义的任意数据 |
kubernetes.io/service-account-token |
服务账号令牌 |
kubernetes.io/dockercfg |
~/.dockercfg 文件的序列化形式 |
kubernetes.io/dockerconfigjson |
~/.docker/config.json 文件的序列化形式 |
kubernetes.io/basic-auth |
用于基本身份认证的凭据 |
kubernetes.io/ssh-auth |
用于 SSH 身份认证的凭据 |
kubernetes.io/tls |
用于 TLS 客户端或者服务器端的数据 |
bootstrap.kubernetes.io/token |
启动引导令牌数据 |
3. 创建 Secret
有几种不同的方式来创建 Secret:
- 使用
kubectl
命令创建 Secret - 使用配置文件来创建 Secret
- 使用 kustomize 来创建 Secret
3.1 使用 kubectl
命令创建 Secret
参数:--from-file
形式:--from-file=[key=]source
1 | echo -n 'admin' > ./username.txt |
1 | kubectl create secret generic db-user-pass \ |
要查看我们刚刚创建的 Secret 的内容,可以运行以下命令:
1 | kubectl get secret db-user-pass -o jsonpath='{.data}' |
3.2 使用配置文件来创建 Secret
先将字符串转为base64
1 | echo -n 'admin' | base64 |
1 | echo -n '1f2d1e2e67df' | base64 |
编写文件:
1 | apiVersion: v1 |
3.3 使用 kustomize 来创建 Secret(Pass)
编辑 Secret
你可以通过下面的命令编辑现有的 Secret:
1 | kubectl edit secrets mysecret |
4. 使用
在 Pod 中使用 Secret 文件
在 Pod 中使用存放在卷中的 Secret:
- 创建一个 Secret 或者使用已有的 Secret。多个 Pod 可以引用同一个 Secret。
- 修改你的 Pod 定义,在
spec.volumes[]
下增加一个卷。可以给这个卷随意命名, 它的spec.volumes[].secret.secretName
必须是 Secret 对象的名字。 - 将
spec.containers[].volumeMounts[]
加到需要用到该 Secret 的容器中。 指定spec.containers[].volumeMounts[].readOnly = true
和spec.containers[].volumeMounts[].mountPath
为你想要该 Secret 出现的尚未使用的目录。 - 修改你的镜像并且/或者命令行,让程序从该目录下寻找文件。 Secret 的
data
映射中的每一个键都对应mountPath
下的一个文件名。
这是一个在 Pod 中使用存放在挂载卷中 Secret 的例子:
1 | apiVersion: v1 |
以环境变量的形式使用 Secrets
将 Secret 作为 Pod 中的环境变量使用:
- 创建一个 Secret 或者使用一个已存在的 Secret。多个 Pod 可以引用同一个 Secret。
- 修改 Pod 定义,为每个要使用 Secret 的容器添加对应 Secret 键的环境变量。 使用 Secret 键的环境变量应在
env[x].valueFrom.secretKeyRef
中指定 要包含的 Secret 名称和键名。 - 更改镜像并/或者命令行,以便程序在指定的环境变量中查找值。
这是一个使用来自环境变量中的 Secret 值的 Pod 示例:
1 | apiVersion: v1 |